package com.yifeng.util;

import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.UUID;

/**
 * 文件操作工具类
 */
public class FileUtil {
    
    // 文件上传目录
    private static final String UPLOAD_DIR = "uploads";
    
    /**
     * 从Part获取文件名
     * @param part 文件Part对象
     * @return 文件名
     */
    public static String getFileName(Part part) {
        if (part == null) {
            return "unknown";
        }
        
        String contentDisposition = part.getHeader("content-disposition");
        if (contentDisposition == null) {
            return "unknown";
        }
        
        String[] tokens = contentDisposition.split(";");
        for (String token : tokens) {
            if (token.trim().startsWith("filename")) {
                String fileName = token.substring(token.indexOf("=") + 1).trim();
                // 去除引号
                fileName = fileName.replace("\"", "");
                return fileName;
            }
        }
        return "unknown";
    }
    
    /**
     * 获取文件扩展名
     * @param fileName 文件名
     * @return 文件扩展名
     */
    public static String getFileExtension(String fileName) {
        if (fileName == null || fileName.isEmpty()) {
            return "unknown";
        }
        
        int dotIndex = fileName.lastIndexOf(".");
        if (dotIndex > 0 && dotIndex < fileName.length() - 1) {
            return fileName.substring(dotIndex + 1).toLowerCase();
        }
        return "unknown";
    }
    
    /**
     * 生成唯一文件名
     * @param extension 文件扩展名
     * @return 唯一文件名
     */
    public static String generateUniqueFileName(String extension) {
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String timestamp = String.valueOf(System.currentTimeMillis());
        
        if ("unknown".equals(extension) || extension.isEmpty()) {
            return timestamp + "_" + uuid;
        } else {
            return timestamp + "_" + uuid + "." + extension;
        }
    }
    
    /**
     * 保存文件到服务器
     * @param filePart 文件Part对象
     * @param basePath 基础路径
     * @return 文件相对路径
     * @throws IOException 文件操作异常
     */
    public static String saveFile(Part filePart, String basePath) throws IOException {
        // 创建上传目录
        File uploadDir = new File(basePath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        
        // 生成文件名
        String originalFileName = getFileName(filePart);
        String fileExtension = getFileExtension(originalFileName);
        String storedFileName = generateUniqueFileName(fileExtension);
        String filePath = basePath + File.separator + storedFileName;
        
        // 保存文件
        try (InputStream input = filePart.getInputStream()) {
            Files.copy(input, new File(filePath).toPath(), StandardCopyOption.REPLACE_EXISTING);
        }
        
        return UPLOAD_DIR + "/" + storedFileName;
    }
    
    /**
     * 获取上传基础路径
     * @return 基础路径
     */
    public static String getUploadBasePath() {
        // 优先从系统属性获取，否则使用当前工作目录
        String configPath = System.getProperty("file.upload.path");
        if (configPath != null && !configPath.trim().isEmpty()) {
            return configPath;
        }
        
        // 默认使用用户目录下的uploads文件夹
        String userHome = System.getProperty("user.home");
        return userHome + File.separator + UPLOAD_DIR;
    }
    
    /**
     * 格式化文件大小
     * @param size 文件大小（字节）
     * @return 格式化后的文件大小字符串
     */
    public static String formatFileSize(long size) {
        if (size <= 0) return "0 B";
        
        final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
        int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
        
        return String.format("%.1f %s", size / Math.pow(1024, digitGroups), units[digitGroups]);
    }
    
    /**
     * 删除文件
     * @param filePath 文件路径
     * @return 是否删除成功
     */
    public static boolean deleteFile(String filePath) {
        if (filePath == null || filePath.trim().isEmpty()) {
            return false;
        }
        
        try {
            File file = new File(filePath);
            return file.exists() && file.delete();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 检查文件类型是否允许
     * @param fileName 文件名
     * @param allowedTypes 允许的文件类型数组
     * @return 是否允许
     */
    public static boolean isFileTypeAllowed(String fileName, String[] allowedTypes) {
        if (fileName == null || allowedTypes == null) {
            return false;
        }
        
        String fileExtension = getFileExtension(fileName).toLowerCase();
        for (String allowedType : allowedTypes) {
            if (allowedType.toLowerCase().equals(fileExtension)) {
                return true;
            }
        }
        return false;
    }
}